package pe.com.cotelasa.scp.dao.impl;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import org.hibernate.Criteria;

import org.hibernate.Hibernate;
import org.hibernate.LockMode;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import org.hibernate.transform.Transformers;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import pe.com.cotelasa.common.dao.DaoImpl;
import pe.com.cotelasa.common.dao.excepcion.DAOException;
import pe.com.cotelasa.scp.dao.IDAOGuiaRemision;
import pe.com.cotelasa.scp.dominio.common.Constantes;
import pe.com.cotelasa.scp.dominio.common.ESTADO_REGISTRO;
import pe.com.cotelasa.scp.dominio.common.util.UtilitarioCadenas;
import pe.com.cotelasa.scp.entidad.GuiaRemision;
import pe.com.cotelasa.scp.entidad.Sede;
import pe.com.cotelasa.scp.to.GuiaRemisionTO;

@SuppressWarnings({"unchecked", "serial", "rawtypes", "deprecation"})
@Repository("daoGuiaRemision")
public class DAOGuiaRemision extends DaoImpl<GuiaRemision, Integer> implements
        IDAOGuiaRemision, Serializable {

    @Override
    public List<GuiaRemisionTO> obtenerGuiaRemisionBusqueda(GuiaRemision guiaRemision, Date fechaInicio, Date fechaFinal)
            throws DAOException {
        try {
            sessionFactory.getCurrentSession().flush();
            Criteria query = sessionFactory.getCurrentSession().createCriteria(GuiaRemision.class)
                    .addOrder(Order.desc("id"))
                    .add(Restrictions.eq("estadoRegistro", "" + ESTADO_REGISTRO.ACTIVO.getValor()))
                    .add(Restrictions.eq("estadoRegistro", "" + ESTADO_REGISTRO.ACTIVO.getValor()))
                    .add(Restrictions.like("numeroGuia", "%" + guiaRemision.getNumeroGuia() + "%"))
                    .add(Restrictions.eq("idEmpresa", guiaRemision.getIdEmpresa()));
            if (guiaRemision.getOrdenPedido().getId() == 0) {
                query = query.add(Restrictions.isNull("ordenPedido"));
            } else if (guiaRemision.getOrdenPedido().getId() != null && guiaRemision.getOrdenPedido().getId() != -1) {
                query = query.add(Restrictions.eq("ordenPedido.id", guiaRemision.getOrdenPedido().getId()));
            }
            if (guiaRemision.getParametroTipoGuia().getId() != 0) {
                query = query.add(Restrictions.eq("parametroTipoGuia.id", guiaRemision.getParametroTipoGuia().getId()));
                if (guiaRemision.getParametroTipoGuia().getId() == Constantes.TipoGuiaRemision.GUIA_ENTRADA) {
                    query = query.createAlias("sedePartida", "s")
                            .createAlias("s.idProveedor", "p")
                            .add(Restrictions.like("p.razonSocial", "%" + guiaRemision.getNombreDestinatario() + "%"));
                } else {
                    query = query.add(Restrictions.like("nombreDestinatario", "%" + guiaRemision.getNombreDestinatario() + "%"));
                }
            }

            if (guiaRemision.getParametroMotivoGuia().getId() != 0) {
                query = query.add(Restrictions.eq("parametroMotivoGuia.id", guiaRemision.getParametroMotivoGuia().getId()));
            }

            if (guiaRemision.getIdOrdenCompraServicio().getId() == 0) {
                query = query.add(Restrictions.isNull("idOrdenCompraServicio"));
            } else if (guiaRemision.getIdOrdenCompraServicio().getId() != null && guiaRemision.getIdOrdenCompraServicio().getId() != -1) {
                query = query.add(Restrictions.eq("idOrdenCompraServicio.id", guiaRemision.getIdOrdenCompraServicio().getId()));
            }
            if (fechaInicio == null && fechaFinal == null) {
                System.out.println("noooooooooooooo entres");
            } else if (fechaInicio != null && fechaFinal != null) {
                query = query.add(Restrictions.ge("fechaEmision", fechaInicio)).add(Restrictions.le("fechaEmision", fechaFinal));
            } else if (fechaInicio == null) {
                query = query.add(Restrictions.le("fechaEmision", fechaFinal));
            } else if (fechaFinal == null) {
                query = query.add(Restrictions.ge("fechaEmision", fechaInicio));
            }

            //List<GuiaRemision> listaGuias = query.list();
            //System.out.println("lista de guias bsuqueda: "+listaGuias);
            List<GuiaRemisionTO> list = new ArrayList<GuiaRemisionTO>();
            for (GuiaRemision guia : (List<GuiaRemision>) query.list()) {
                //guia = 
                GuiaRemisionTO guiaTo = new GuiaRemisionTO();
                guiaTo.setDestinatario(guia.getNombreDestinatario());
                guiaTo.setEstado(guia.getEstadoGuia().charAt(0));
                guiaTo.setId_guia_remision(guia.getId());
                guiaTo.setTipo_guia(guia.getParametroTipoGuia().getValCadena());
                guiaTo.setCantidad(guia.getCantidadTotal());
                guiaTo.setUnidad(guia.getUnidad());
                guiaTo.setMotivo(guia.getParametroMotivoGuia().getValCadena());
                guiaTo.setNro_guia(guia.getSerie() + "-" + guia.getNumeroGuia());
                if (guia.getOrdenPedido() != null) {
                    guiaTo.setNro_ordenp(guia.getOrdenPedido().getCodigoOrdenPedido());
                } else {
                    guiaTo.setNro_ordenp("");
                }
                if (guia.getIdOrdenCompraServicio() != null) {
                    guiaTo.setNro_ordencs(guia.getIdOrdenCompraServicio().getCodigo());
                } else {
                    guiaTo.setNro_ordencs("");
                }
                if (guia.getParametroTipoGuia().getValCadena().equalsIgnoreCase(Constantes.TipoMovimiento.SALIDA)) {
                    guiaTo.setRemitente(guia.getIdEmpresa().getRazonSocial());
                } else {
                    guiaTo.setRemitente(guia.getSedePartida().getIdEmpresa() == null ? guia.getSedePartida().getIdProveedor().getRazonSocial()
                            : guia.getSedePartida().getIdEmpresa().getRazonSocial());
                }
                if (!guiaTo.getNro_ordencs().equalsIgnoreCase("") && guia.getIdOrdenCompraServicio().getTipo() == 'C') {
                    guiaTo.setForma(guia.getIdOrdenCompraServicio().getIdCategoriaArticulo().getIdCategoriaArticulo().getNombre());
                } else if (!guiaTo.getNro_ordencs().equalsIgnoreCase("") && guia.getIdOrdenCompraServicio().getTipo() == 'S') {
                    String[] forma = guia.getIdOrdenCompraServicio().getServicio().split(" ");
                    guiaTo.setForma(forma[forma.length - 1]);
                } else {
                    guiaTo.setForma("");
                }
                if (guia.getIdFactura() != null) {
                    guiaTo.setNum_factura(guia.getIdFactura().getSerie() + "-" + guia.getIdFactura().getNumeroFactura());
                } else {
                    guiaTo.setNum_factura("");
                }

                guiaTo.setEntregado(guia.getEstaEntregado());
                list.add(guiaTo);
            }


            return list;
        } catch (Exception e) {
            throw new DAOException(e.getMessage(), e);
        }
    }

    @Override
    public Collection<GuiaRemision> obtenerGuiasPorSerie(GuiaRemision guia, Date fechaInicio, Date fechaFinal) throws DAOException {
        String[] listaEsdado = {String.valueOf(GuiaRemision.ESTADO_GUIA_REMISION.ANULADO.getValor()), String.valueOf(GuiaRemision.ESTADO_GUIA_REMISION.EMITIDO.getValor())};
        sessionFactory.getCurrentSession().flush();
        Collection<GuiaRemision> lista = new ArrayList<GuiaRemision>();
        Criteria query = sessionFactory.getCurrentSession().createCriteria(GuiaRemision.class)
                .addOrder(Order.desc("numeroGuia"))
                .add(Restrictions.eq("estadoRegistro", "" + ESTADO_REGISTRO.ACTIVO.getValor()))
                .add(Restrictions.eq("tipoCompPago", guia.getTipoCompPago()))
                .add(Restrictions.eq("idEmpresa", guia.getIdEmpresa()))
                .add(Restrictions.eq("serie", guia.getSerie()))
                .add(Restrictions.eq("parametroTipoGuia.id", Constantes.TipoGuiaRemision.GUIA_SALIDA))
                .add(Restrictions.in("estadoGuia", listaEsdado));

        if (fechaInicio == null && fechaFinal == null) {
            lista = query.list();
        } else if (fechaInicio != null && fechaFinal != null) {
            lista = query.add(Restrictions.ge("fechaEmision", fechaInicio)).add(Restrictions.le("fechaEmision", fechaFinal)).list();
        } else if (fechaInicio == null) {
            lista = query.add(Restrictions.le("fechaEmision", fechaFinal)).list();
        } else if (fechaFinal == null) {
            lista = query.add(Restrictions.ge("fechaEmision", fechaInicio)).list();
        }
        //lista = 
        return lista;
    }
}
